Модуль:Wikidata/P512
local p = {} -- Функция формирует строку с викиразметкой для переданного свойства Принимает: объект контекста для вызова форматтеров и таблицу настройек Возвращает: вики-форматированную строку function p.formatAcademicDegree( context, options ) if ( not context ) then error( 'context not specified' ); end; if ( not options ) then error( 'options not specified' ); end; if ( not options.entity ) then error( 'options.entity missing' ); end; local claims = context.selectClaims( options, options.property ); if (claims nil) then return '' end local blackList = p.getPreviousDegrees( claims ) local formattedClaims = {} for i, claim in ipairs(claims) do if (claim.mainsnak.datavalue and not blackList[claim.mainsnak.datavalue.value'numeric-id']) then local formattedStatement = context.formatStatement( options, claim ) if (formattedStatement) then formattedStatement = '' .. formattedStatement .. '' if (claim.qualifiers) then formattedStatement = formattedStatement .. p.formatQualifier( context, options, claim.qualifiers.P585 ) end formattedStatement = formattedStatement .. p.formatCorrespondingCategory( claim ) table.insert( formattedClaims, formattedStatement ) end end end -- создание текстовой строки со списком оформленых заявлений из таблицы return mw.text.listToText( formattedClaims, options.separator, options.conjunction ); end -- Функция помещает в скобки текст первого квалификатора из переданной таблицы Принимает: объект контекста для вызова форматтеров, таблицу настроеки и таблицу квалификаторов Возвращает: отформатированная строка с квалификатором function p.formatQualifier( context, options, qualifiers ) if (qualifiers~=nil and qualifiers1 ~= nil) then return ' (' .. context.formatSnak( options, qualifiers1 ) .. ')' end return '' end -- Функция формирует список соответствующих ученых степеней нижней ступени (P155) Например, для "доктор искусствоведения" это будет "кандидат искусствоведения" Принимает: объект таблицу сущностей - академических степеней персоны (P512) Возвращает: объект таблицу идентификаторов степеней нижней ступени function p.getPreviousDegrees( claims ) -- Пока нет нормальной возможности загружать элементы c кэшем -- снаружи Module:Wikidata, мы эти соответствия захардкодим (без Q) local correspondingCandidates = { 16698078 = 19610224, -- архитектор 17281188 = 19610186, -- биолог 17281187 = 19610187, -- ветеринар 17281186 = 19610193, -- военный 16698080 = 19610195, -- географ 16698082 = 19610197, -- гео-мин 17281180 = 18523814, -- искусствовед 12101789 = 18523811, -- историк 16698084 = 19610200, -- культуролог 17281165 = 19610203, -- медик 17281161 = 19610206, -- педагог 12101787 = 4212319, -- политолог 17281156 = 19610208, -- психолог 17281153 = 19610210, -- сель-хоз 17281152 = 19610212, -- социолог 17281125 = 18071588, -- техник 17281115 = 19610228, -- фармацевт 17281097 = 18002832, -- физ-мат 17281087 = 19603970, -- филолог 17281084 = 19603972, -- философ 17281079 = 19610312, -- химик 17281072 = 17744738, -- экономист 18745564 = 19610320 -- юрист } local previousElements = {} for i, claim in ipairs(claims) do if(claim.mainsnak.datavalue) then local entityId = claim.mainsnak.datavalue.value'numeric-id' if (entityId) then if correspondingCandidatesentityId then previousElements[correspondingCandidatesentityId] = true end end end end return previousElements end -- Функция формирует вики-разметку категории, соответствующей ученой степени Принимает: объект таблицу утверждения Возвращает: строку оформленного текста либо пустую строку function p.formatCorrespondingCategory (claim) if ( not claim ) then return '' end; if ( not claim.references ) then return '' end; if ( not claim.mainsnak ) then return '' end; local label = mw.wikibase.label("Q" .. claim.mainsnak.datavalue.value'numeric-id') local result, changes = string.gsub(label, "доктор ", "Категория:Доктора ") if (changes 1) then return '' .. result .. '' end result, changes = string.gsub(label, "кандидат ", "Категория:Кандидаты ") if (changes 1) then return '' .. result .. '' end return '' end return p